package cn.serein.work;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.MessageProperties;

import java.util.Scanner;


/**
 * 当rabbitmq关闭时, 我们队列中的消息仍然会丢失, 除非明确要求它不要丢失数据
 *
 * 要求rabbitmq不丢失数据要做如下两点: 把队列和消息都设置为可持久化(durable)
 */
public class WorkProducer {
    public static void main(String[] args) throws Exception {
        //1.连接到RabbitMQ服务器
        ConnectionFactory cf = new ConnectionFactory();
        //利用连接工厂设置连接信息
        cf.setHost("192.168.8.100");
        cf.setPort(5672);//可选，5672是默认端口
        cf.setUsername("admin");
        cf.setPassword("Aq71056r");
        //2.创建连接对象（TCP）---所有的RabbitMQ服务器的客户端使用一个tcp连接对象
        Connection nc = cf.newConnection();
        //3.利用tcp连接对象创建channel（通道）
        Channel cc = nc.createChannel();
        //4.通过channel创建队列
        //第一个参数：队列名为simple.queue
        //第二个参数：队列是否持久化,改为true，表示队列持久化
        //第三个参数：队列是否独占
        //第四个参数：队列是否自动删除
        //第五个参数：其他属性的设置
        cc.queueDeclare("work.queue", true, false, false, null);
        String s = null;
        //在一个While(true)中完成
        while (true) {
            System.out.print("输入数据: ");
            //利用Scanner工具类完成
            s = new Scanner(System.in).nextLine();
            //如果输入quit关键字，则退出循环
            if (s.equals("quit")) {
                break;
            }
            //发送数据到RabbitMQ中，使用第三个参数设置消息持久化
            cc.basicPublish("", "work.queue", MessageProperties.PERSISTENT_TEXT_PLAIN, s.getBytes());
        }
        nc.close();
    }
}
